const Router = require('koa-router');
const router = new Router();
const userDao = require('../dao/UserDao');
const { crypto, dateFormat, isEmpty, generateToken } = require('../utils/index');

/**
 * 登录、注册前置参数验证中间件
 * 实现多种方式登录:
 * 1.账号密码：（用户名、手机号、邮箱）+ 密码。用户名由字母、数字、中文等任一组合组成。纯数字不能为手机号
 * 2.快捷登录：手机号 +  短信验证码
 * 注：暂时只能使用账号密码方式登录或注册
 */
const verfiyParam = async (ctx, next) => {
  const username = ctx.request.body['username'];
  const password = ctx.request.body['password'];
  if (isEmpty(username) || isEmpty(password)) {
    return ctx.sendResult(null, 200, '账号或密码不能为空');
  }
  await next();
};

// 根据账号类别设置查询条件
const getCondition = param => {
  const regx = [
    /^(0|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/,
    /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/
  ];
  let condition = {};
  if (regx[0].test(param)) {
    // 匹配手机号
    condition = { user_phone: param };
  } else if (regx[1].test(param)) {
    // 匹配邮箱
    condition = { user_email: param };
  } else {
    // 匹配用户名
    condition = { user_name: param };
  }
  return condition;
};

// login
router.post('/login', verfiyParam, async (ctx, next) => {
  const username = ctx.request.body['username'];
  const password = ctx.request.body['password'];
  // const { username, password } = ctx.request.body;
  const condition = getCondition(username);
  // 查询数据库
  const res = await userDao.findOne({ where: condition });
  // 如果用户存在，则校验密码
  if (res) {
    if (res.user_pwd === crypto.encrypt(password)) {
      const userinfo = {
        user_id: res.user_id,
        user_name: res.user_name,
        user_phone: res.user_phone,
        user_email: res.user_email
      };
      // 添加token信息
      const token = generateToken({ ...userinfo, time: new Date().getTime() });
      ctx.sendResult({ userinfo, token }, 200, '登录成功');
    } else {
      ctx.sendResult(null, 200, '账号或密码错误');
    }
  } else {
    ctx.sendResult(null, 200, '账号不存在');
  }
});

// 用户注册
router.post('/register', verfiyParam, async (ctx, next) => {
  const username = ctx.request.body['username'];
  const password = ctx.request.body['password'];
  // 查询数据库
  const isExit = await userDao.findOne({ where: { user_name: username } });
  if (isExit) {
    ctx.sendResult(null, 200, '账号已存在');
  } else {
    const res = await userDao.create({
      user_name: username,
      user_pwd: crypto.encrypt(password),
      create_time: dateFormat('YYYY-mm-dd HH:MM:SS', new Date()),
      update_time: dateFormat('YYYY-mm-dd HH:MM:SS', new Date())
    });
    ctx.sendResult(null, 201, res ? '注册成功' : '注册失败');
  }
});

// logout
router.post('/logout', async (ctx, next) => {});

// 获取所有用户
router.post('/list', async (ctx, next) => {
  const res = await userDao.findAll();
  ctx.sendResult(res, 200, '获取到数据');
});

// 修改个人信息
router.post('/update', async (ctx, next) => {
  const form = ctx.request.body['form'];
  const res = await userDao.update({
    fields: form['fields'],
    conditions: {
      where: { user_id: form['id'] }
    }
  });
  ctx.sendResult(null, 200, res ? '修改成功' : '修改失败');
});

module.exports = router;
